package com.wei.czz.framework.admin.controller;

import com.wei.czz.common.annotation.Auth;
import com.wei.czz.common.annotation.Resubmit;
import com.wei.czz.common.dto.admin.deptRole.DeptRoleDto;
import com.wei.czz.common.jsr303.group.Save;
import com.wei.czz.common.jsr303.group.Search;
import com.wei.czz.common.jsr303.group.Update;
import com.wei.czz.common.property.BatchProperty;
import com.wei.czz.common.tool.PageDto;
import com.wei.czz.common.tool.Result;
import com.wei.czz.common.vo.admin.deptRole.DeptRoleFormVo;
import com.wei.czz.common.vo.admin.deptRole.DeptRoleVo;
import com.wei.czz.common.vo.common.UpdateStatusVo;
import com.wei.czz.framework.admin.manager.DeptRoleManager;
import lombok.AllArgsConstructor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * Created by IntelliJ IDEA.
 *
 * @author wei
 * date: 2024-04-29 11:56:58
 * className: MenuController 部门与角色关联请求接口类
 * version: 1.0
 * description:
 */
@RestController
@RequestMapping("/sys/dept-role")
@AllArgsConstructor
public class DeptRoleController {

    private static final Logger log = LoggerFactory.getLogger(DeptRoleController.class);

    private final BatchProperty batchProperty;

    private final DeptRoleManager deptRoleManager;

    /**
     * 保存部门与角色关联关系接口
     * <p>
     * 此接口会校验是否重复提交
     * @param deptRoleVo 参数对象
     * @return 结果
     */
    @Resubmit(message = "保存部门与角色关联关系")
    @PostMapping("/save")
    @Auth(permit = "system:dept-role:save")
    public Result<Object> saveDeptRole(@Validated(Save.class) @RequestBody DeptRoleVo deptRoleVo) {
        log.info("开始保存部门与角色关联关系业务。{}", deptRoleVo);

        deptRoleManager.save(deptRoleVo);

        log.info("保存部门与角色关联关系业务结束");
        return Result.success();
    }

    /**
     * 分页获取部门与角色关联关系接口
     * @param deptRoleFormVo 参数对象
     * @return 结果
     */
    @PostMapping("/page/list")
    @Auth(permit = "system:dept-role:list")
    public Result<PageDto<DeptRoleDto>> getDeptRolePageList(
            @Validated(Search.class) @RequestBody DeptRoleFormVo deptRoleFormVo) {
        log.info("开始分页获取部门与角色关联关系业务。{}", deptRoleFormVo);

        PageDto<DeptRoleDto> pageDto = deptRoleManager.getPageList(deptRoleFormVo);

        log.info("分页获取部门与角色关联关系业务结束");
        return Result.success(pageDto);
    }

    /**
     * 修改部门与角色关联关系接口
     * <p>
     * 此接口会校验是否重复提交
     * @param deptRoleVo 参数对象
     * @return 结果
     */
    @Resubmit(message = "修改部门与角色关联关系")
    @PostMapping("/update")
    @Auth(permit = "system:dept-role:update")
    public Result<Object> updateDeptRole(@Validated(Update.class) @RequestBody DeptRoleVo deptRoleVo) {
        log.info("开始修改部门与角色关联关系业务。{}", deptRoleVo);

        deptRoleManager.update(deptRoleVo);

        log.info("修改部门与角色关联关系业务结束");
        return Result.success();
    }

    /**
     * 修改部门与角色关联状态接口
     * <p>
     * 此接口会校验是否重复提交
     * @param updateStatusVo 参数对象
     * @return 结果
     */
    @Resubmit(message = "修改部门与角色关联状态")
    @PostMapping("/update/status")
    @Auth(permit = "system:dept-role:update")
    public Result<Object> updateDeptRoleStatus(@Validated @RequestBody UpdateStatusVo updateStatusVo) {
        log.info("开始修改部门与角色关联状态业务。{}", updateStatusVo);

        deptRoleManager.updateStatus(updateStatusVo);

        log.info("修改部门与角色关联状态业务结束");
        return Result.success();
    }

    /**
     * 删除部门与角色关联关系接口
     * <p>
     * 此接口会校验是否重复提交
     * @param idList 主键列表
     * @return 结果
     */
    @Resubmit(message = "修改部门与角色关联关系")
    @DeleteMapping("/delete")
    @Auth(permit = "system:dept-role:delete")
    public Result<Object> deleteDeptRole(@RequestBody List<Long> idList) {
        log.info("开始删除部门与角色关联关系业务。idList={}", idList);
        if (idList.isEmpty()) {
            return Result.clientFail("主键列表不能为空");
        }
        if (batchProperty.getMaxSize() < idList.size()) {
            log.warn("删除数量超过限制。batch.size={} size={}", batchProperty.getMaxSize(), idList.size());
            return Result.clientFail("一次删除最多允许删除" + batchProperty.getMaxSize() + "条数据");
        }

        deptRoleManager.batchDelete(idList);

        log.info("删除部门与角色关联关系业务结束");
        return Result.success();
    }
}
